Technical Q&A QA1208
CFXML to CFPropertyListRef (and back!)


Q: CFPropertyListRef Ç XML ÉtÉ@ÉCÉãÇ…ï€ë∂ǵÇΩÇËÅAXML ÉtÉ@ÉCÉãÇ©ÇÁ CFPropertyListRef Çïúå≥ǵÇΩÇËÇ∑ÇÈä»íPÇ»ï˚ñ@ÇÕdžÇËÇ‹Ç∑Ç©ÅH

A: è⁄ç◊ÇÕÇ∑Ç◊ǃÅA<http://developer.apple.com/documentation/CoreFoundation/Conceptual/CFPropertyLists/Tasks/Saving.html> Ç…ãLèqÇ≥ÇÍǃǢNjÇ∑ÅB

íPÇ…ÉRÅ[ÉhÇæÇØÇímÇËÇΩÇ¢èÍçáÇÕÅAâ∫ãLÇéQèΔǵǃÇ≠ÇæÇ≥Ç¢ÅB

 

/**\
|**|    DZDZÇ≈ÇÕÅAÉvÉçÉpÉeÉBÉäÉXÉgÇ XML ÉtÉ@ÉCÉãÇ…ï€ë∂
\**/
 
SInt32 SaveToXMLFile(
    CFPropertyListRef pCFPRef,
    CFStringRef pFilePathCFStrRef)
{
    CFDataRef xmlCFDataRef;
    CFURLRef myCFURLRef;
    Boolean status;
    SInt32 errorCode = noErr;
 
// ÉvÉçÉpÉeÉBÉäÉXÉgÇ XML ÉfÅ[É^Ç…ïœä∑
    xmlCFDataRef = CFPropertyListCreateXMLData(
        kCFAllocatorDefault, pCFPRef);
 
// DZÇÍÇ©ÇÁçÏê¨Ç∑ÇÈ XML ÉfÅ[É^ÇÃï€ë∂êÊÇÃÉtÉ@ÉCÉãÇ
// éwíËÇ∑ÇÈ URL ÇçÏê¨
    myCFURLRef = CFURLCreateWithFileSystemPath(
            kCFAllocatorDefault,
pFilePathCFStrRef,    // ÉtÉ@ÉCÉãÉpÉXñº
kCFURLHFSPathStyle,
false );              // ÉfÉBÉåÉNÉgÉäÇ©ÅH
 
// XML ÉfÅ[É^ÇÉtÉ@ÉCÉãÇ…èëÇ´çûÇfi
    status = CFURLWriteDataAndPropertiesToResource (
myCFURLRef,          // égópÇ∑ÇÈ URL
xmlCFDataRef,        // èëÇ´çûÇfiÉfÅ[É^
            NULL,
            &errorCode);
 
// âï˙Ç∑ÇÈê”îCÇÃdžÇÈÇ∑Ç◊ǃÇà CF ÉIÉuÉWÉFÉNÉgÇâï˙
    CFRelease(xmlCFDataRef);
    CFRelease(myCFURLRef);
 
    return errorCode;    
}
 
/**\
|**|    DZDZÇ≈ÇÕÅAXML ÉtÉ@ÉCÉãÇÉvÉçÉpÉeÉBÉäÉXÉgÇ÷ÉçÅ[Éh
\**/
 
CFPropertyListRef LoadFromXMLFile(
    CFPropertyListRef pCFPRef,
    CFStringRef pFilePathCFStrRef)
{
    CFURLRef myCFURLRef;
    CFDataRef xmlCFDataRef;
    CFPropertyListRef myCFPropertyListRef = NULL;
    SInt32 errorCode = noErr;
    Boolean status;
 
// XML ÉfÅ[É^ÇÉçÅ[ÉhÇ∑ÇÈå≥ÇÃÉtÉ@ÉCÉãÇ
// éwíËÇ∑ÇÈ URL ÇçÏê¨
    myCFURLRef = CFURLCreateWithFileSystemPath(
            kCFAllocatorDefault,
pFilePathCFStrRef,    // ÉtÉ@ÉCÉãÉpÉXñº
            kCFURLHFSPathStyle,
false );              // ÉfÉBÉåÉNÉgÉäÇ©ÅH
 
// XML ÉtÉ@ÉCÉãÇì«Ç›éÊÇÈ
    status = CFURLCreateDataAndPropertiesFromResource(
            kCFAllocatorDefault,
            myCFURLRef,
&xmlCFDataRef,        // ÉtÉ@ÉCÉãÉfÅ[É^ÇíuÇ≠èÍèä
            NULL,
            NULL,
            &errorCode);
 
    if (!status)
    {
        CFStringRef    errorString;
// XML ÉfÅ[É^ÇégǡǃÉfÉBÉNÉVÉáÉiÉäÇçƒç\ê¨
        myCFPropertyListRef = CFPropertyListCreateFromXMLData(
                kCFAllocatorDefault,
                xmlCFDataRef,
                kCFPropertyListImmutable,
                &errorString);
    }
 
// âï˙Ç∑ÇÈê”îCÇÃdžÇÈÇ∑Ç◊ǃÇà CF ÉIÉuÉWÉFÉNÉgÇâï˙
    CFRelease(myCFURLRef);
    CFRelease(xmlCFDataRef);
 
    return myCFPropertyListRef;
}
 

ÉäÉXÉg 1. CFXML <-> CFPropertyList


[2003 îN 8 åé 20 ì˙]